Packages
#install.packages("pacman")
#pacman::p_install_gh("systats/binoculaR")
pacman::p_load(tidyverse, magrittr, haven, ggthemes, sjPlot, sjmisc, sjstats, binoculaR, ggplot2, grid, gridExtra, gtable, cowplot, psych, car, lme4, ggpubr, rmarkdown, texreg, MuMIn, janitor, plotly, here)
Installing package into 㤼㸱C:/Users/Fabio/Documents/R/win-library/3.4㤼㸲
(as 㤼㸱lib㤼㸲 is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.4/here_0.1.zip'
Content type 'application/zip' length 16785 bytes (16 KB)
downloaded 16 KB
package ‘here’ successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\Fabio\AppData\Local\Temp\RtmpIfuLhM\downloaded_packages
here installed
package 㤼㸱here㤼㸲 was built under R version 3.4.3
Load in Data
arab4 <- read_spss("data/arab4.sav")
# arab4 <- get(load(url("https://github.com/favstats/GodlyGovernance/raw/master/data/arab4.Rdata")))
ifelse4cat_rec <- function(variable) {
recoded <- ifelse(variable == 0 | variable > 5, NA, 5 - variable)
return(recoded)
}
Filter Data
arab4 %<>%
filter(q1012 == 1) %>%#only Muslims
mutate(sample = ifelse(is.na(sample) | sample == 1, 1, 2)) # %>%
# filter(sample != 2) #only non-refugees
Recoding
table(arab4$country)
1 5 8 10 13 15 21
1199 1146 1472 902 1199 1177 1200
arab4 %<>%
mutate(cntry = sjmisc::to_label(country)) %>%
mutate(region = sjmisc::to_label(a1)) %>%
mutate(governorate = sjmisc::to_label(q1)) %>%
mutate(year = 2016) %>%
mutate(cntry = case_when(
sample == 2 ~ "Syrian Refugees",
TRUE ~ as.character(cntry)
)) %>%
filter(cntry != "Egypt") %>%
mutate(region = sjmisc::to_label(a1)) %>%
mutate(governorate = sjmisc::to_label(q1)) %>%
mutate(district = sjmisc::to_label(q2)) %>%
mutate(daesh_resp = factor(sjmisc::to_label(q831))) %>%
mutate(daesh_resp = case_when(
daesh_resp == "Don't know (Do not read)" ~ "Don't know",
daesh_resp == "GCC country (other than Saudi Arabia)" ~ "Other Gulf country",
daesh_resp == "Decline to answer (Do not read)" ~ "Decline to answer",
TRUE ~ as.character(daesh_resp)
)) %>%
mutate(threat_cntry_num = ifelse(q826 > 5, NA, q826)) %>%
mutate(threat_reg_num = ifelse(q827 > 5, NA, q827)) %>%
mutate(daesh_islam_num = ifelse(q828 > 5, NA, 5 - q828)) %>%
mutate(daesh_goal_num = ifelse(q829 > 5, NA, 5 - q829)) %>%
mutate(daesh_violence_num = ifelse(q830 > 5, NA, 5 - q830))
# Dependent Variable
arab4 %<>%
mutate(islamistparties = ifelse(q5182 > 5, NA, 5 - q5182)) %>%
mutate(islamistgov = ifelse(q5184 > 5, NA, 5 - q5184)) %>%
mutate(religinterfere = ifelse(q6061 > 5, NA, q6061)) %>%
mutate(religleaders = ifelse(q6062 > 5, NA, 5 - q6062)) %>%
mutate(religleadersinfl = ifelse(q6063 > 5, NA, 5 - q6063)) %>%
mutate(seperation = ifelse(q6064 > 5, NA, q6064)) %>%
mutate(religparty = Recode(q605a, "1 = 1;
2 = 1;
3 = 0;
4 = 0;
5 = 0;
98 = 0;
99 = NA")) %>%
mutate(religparty2 = Recode(q605a, "1 = 5;
2 = 4;
3 = 2;
4 = 1;
5 = 3;
98 = NA;
99 = NA"))
arab4 %<>%
mutate(female = ifelse(q1002 == 2, 1, 0)) %>%
mutate(work = ifelse(q1004 == 0 | q1004 > 5, NA, abs(q1004 - 2))) %>%
mutate(income = ifelse4cat_rec(q1016)) %>%
mutate(age = ifelse(q1001 == 0 | q1001 == 9999, NA, q1001)) %>%
mutate(educ = case_when(
q1003 == 0 ~ NA_real_,
q1003 == 98 ~ NA_real_,
q1003 == 99 ~ NA_real_,
q1003 == 5 ~ 4,
q1003 == 6 ~ 5,
q1003 == 7 ~ 6,
t1003 == 0 ~ NA_real_,
t1003 == 98 ~ NA_real_,
t1003 == 99 ~ NA_real_,
t1003 == 3 ~ 3,
t1003 == 4 ~ 4,
t1003 == 5 ~ 5,
t1003 == 6 ~ 6,
TRUE ~ as.numeric(q1003))
) %>%
mutate(globalism = ifelse(q701b == 0 | q701b > 5, NA, q701b)) %>%
mutate(pray = ifelse(q6101 == 0 | q6101 > 5, NA, 6 - q6101)) %>%
mutate(quran = ifelse(q6106 == 0 | q6106 > 5, NA, 6 - q6106)) %>%
mutate(womanwork = ifelse(q6012 == 0 | q6012 > 5, NA, q6012)) %>%
mutate(womenleader = ifelse4cat_rec(q6013)) %>%
mutate(womeneduc = ifelse4cat_rec(q6014)) %>%
mutate(nodemoc = ifelse(q6071 == 0 | q6071 > 5, NA, q6071)) %>%
mutate(genderapartuni = ifelse4cat_rec(q6074)) %>%
mutate(coverup = ifelse4cat_rec(q6076))
Excluding ISIS
frq(arab4 %>% select(daesh_islam_num, daesh_goal_num, daesh_violence_num))
[34m# Total N = 7149 (valid N = 6951)
[39m
val frq label raw.prc valid.prc cum.prc
1 6170 <none> 86.31 88.76 88.76
2 434 <none> 6.07 6.24 95.01
3 202 <none> 2.83 2.91 97.91
4 145 <none> 2.03 2.09 100.00
<NA> 198 <none> 2.77 NA NA
[34m# Total N = 7149 (valid N = 7019)
[39m
val frq label raw.prc valid.prc cum.prc
1 6477 <none> 90.60 92.28 92.28
2 358 <none> 5.01 5.10 97.38
3 135 <none> 1.89 1.92 99.30
4 49 <none> 0.69 0.70 100.00
<NA> 130 <none> 1.82 NA NA
[34m# Total N = 7149 (valid N = 7047)
[39m
val frq label raw.prc valid.prc cum.prc
1 6604 <none> 92.38 93.71 93.71
2 295 <none> 4.13 4.19 97.90
3 75 <none> 1.05 1.06 98.96
4 73 <none> 1.02 1.04 100.00
<NA> 102 <none> 1.43 NA NA
arab4 %<>%
mutate(symp = case_when(
# daesh_islam_num == 1 ~ 0,
# daesh_islam_num == 2 ~ 0,
daesh_islam_num == 3 ~ 1,
daesh_islam_num == 4 ~ 1,
# daesh_goal_num == 1 ~ 0,
# daesh_goal_num == 2 ~ 0,
daesh_goal_num == 3 ~ 1,
daesh_goal_num == 4 ~ 1,
# daesh_violence_num == 1 ~ 0,
# daesh_violence_num == 2 ~ 0,
daesh_violence_num == 3 ~ 1,
daesh_violence_num == 4 ~ 1,
TRUE ~ 0
)) %>%
mutate(compatible = case_when(
daesh_islam_num == 1 ~ 0,
daesh_islam_num == 2 ~ 0,
daesh_islam_num == 3 ~ 1,
daesh_islam_num == 4 ~ 1,
TRUE ~ NA_real_
)) %>%
mutate(goals = case_when(
daesh_goal_num == 1 ~ 0,
daesh_goal_num == 2 ~ 0,
daesh_goal_num == 3 ~ 1,
daesh_goal_num == 4 ~ 1,
TRUE ~ NA_real_
)) %>%
mutate(violence = case_when(
daesh_violence_num == 1 ~ 0,
daesh_violence_num == 2 ~ 0,
daesh_violence_num == 3 ~ 1,
daesh_violence_num == 4 ~ 1,
TRUE ~ NA_real_
)) %>%
mutate(symp2 = daesh_islam_num + daesh_goal_num + daesh_violence_num) %>%
mutate(symp3 = ifelse(symp2 >= 5, 1, 0)) %>%
select(cntry, year, region, governorate , islamistparties , islamistgov, religinterfere, religleaders, religleadersinfl, seperation, religparty, religparty2, female, work, income, age, educ, globalism, pray, quran, womanwork, womenleader, womeneduc, nodemoc, genderapartuni, coverup, daesh_islam_num, daesh_goal_num, daesh_violence_num, symp, symp2, symp3, wt, compatible, goals, violence) #%>%
# filter(daesh_islam_num >= 3 | daesh_goal_num >= 3 | daesh_violence_num >= 3) %>%
# select(daesh_islam_num, daesh_goal_num, daesh_violence_num, symp, symp2, symp3) %>%
# frq()
arab4 %>%
select(daesh_islam_num, daesh_goal_num, daesh_violence_num, cntry) %>%
na.omit() %>%
select(cntry) %>%
table()
.
Algeria Jordan Lebanon
1139 1158 614
Morocco Palestine Syrian Refugees
1144 1132 570
Tunisia
1150
arab4 %>%
select(compatible, goals, violence, cntry) %>%
frq()
[34m# Total N = 7149 (valid N = 6951)
[39m
val frq label raw.prc valid.prc cum.prc
0 6604 <none> 92.38 95.01 95.01
1 347 <none> 4.85 4.99 100.00
<NA> 198 <none> 2.77 NA NA
[34m# Total N = 7149 (valid N = 7019)
[39m
val frq label raw.prc valid.prc cum.prc
0 6835 <none> 95.61 97.38 97.38
1 184 <none> 2.57 2.62 100.00
<NA> 130 <none> 1.82 NA NA
[34m# Total N = 7149 (valid N = 7047)
[39m
val frq label raw.prc valid.prc cum.prc
0 6899 <none> 96.50 97.9 97.9
1 148 <none> 2.07 2.1 100.0
<NA> 102 <none> 1.43 NA NA
[34m# Total N = 7149 (valid N = 7149)
[39m
val frq label raw.prc valid.prc cum.prc
Algeria 1199 <none> 16.77 16.77 16.77
Jordan 1172 <none> 16.39 16.39 33.17
Lebanon 615 <none> 8.60 8.60 41.77
Morocco 1199 <none> 16.77 16.77 58.54
Palestine 1177 <none> 16.46 16.46 75.00
Syrian Refugees 587 <none> 8.21 8.21 83.21
Tunisia 1200 <none> 16.79 16.79 100.00
<NA> 0 <none> 0.00 NA NA
Factor Analysis
f31 <- arab4 %>%
select(islamistparties, islamistgov,
religleaders, religleadersinfl) %>%
fa(1, rotate = "promax",
fm = "pa",
scores = "regression")
fa.diagram(f31)

f31
Factor Analysis using method = pa
Call: fa(r = ., nfactors = 1, rotate = "promax", scores = "regression",
fm = "pa")
Standardized loadings (pattern matrix) based upon correlation matrix
PA1 h2 u2 com
islamistparties 0.49 0.24 0.76 1
islamistgov 0.50 0.25 0.75 1
religleaders 0.74 0.55 0.45 1
religleadersinfl 0.66 0.43 0.57 1
PA1
SS loadings 1.46
Proportion Var 0.37
Mean item complexity = 1
Test of the hypothesis that 1 factor is sufficient.
The degrees of freedom for the null model are 6 and the objective function was 0.71 with Chi Square of 5041.96
The degrees of freedom for the model are 2 and the objective function was 0.07
The root mean square of the residuals (RMSR) is 0.07
The df corrected root mean square of the residuals is 0.13
The harmonic number of observations is 6572 with the empirical chi square 431.33 with prob < 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022
The total number of observations was 7149 with Likelihood Chi Square = 497.61 with prob < 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000088
Tucker Lewis Index of factoring reliability = 0.705
RMSEA index = 0.186 and the 90 % confidence intervals are 0.173 0.2
BIC = 479.86
Fit based upon off diagonal values = 0.96
Measures of factor score adequacy
PA1
Correlation of (regression) scores with factors 0.85
Multiple R square of scores with factors 0.72
Minimum correlation of possible factor scores 0.44
arab4 <- predict(f31, arab4 %>%
select(islamistparties, islamistgov,
religleaders, religleadersinfl)) %>%
data.frame() %>%
rename(islamism = PA1) %>%
cbind(arab4)
#%>%
# ggplot(aes(islamism)) +
# geom_histogram() +
# facet_wrap(~cntry, scales = "free")
#sjPlot::view_df(arab, show.frq = T, show.prc = T)
f21 <- arab4 %>%
select(daesh_islam_num, daesh_goal_num, daesh_violence_num) %>%
fa(1, rotate = "promax",
fm = "pa",
scores = "regression")
fa.diagram(f21)

f21
Factor Analysis using method = pa
Call: fa(r = ., nfactors = 1, rotate = "promax", scores = "regression",
fm = "pa")
Standardized loadings (pattern matrix) based upon correlation matrix
PA1 h2 u2 com
daesh_islam_num 0.65 0.42 0.58 1
daesh_goal_num 0.88 0.77 0.23 1
daesh_violence_num 0.67 0.45 0.55 1
PA1
SS loadings 1.64
Proportion Var 0.55
Mean item complexity = 1
Test of the hypothesis that 1 factor is sufficient.
The degrees of freedom for the null model are 3 and the objective function was 0.84 with Chi Square of 6028.12
The degrees of freedom for the model are 0 and the objective function was 0
The root mean square of the residuals (RMSR) is 0
The df corrected root mean square of the residuals is NA
The harmonic number of observations is 6968 with the empirical chi square 0.15 with prob < NA
The total number of observations was 7149 with Likelihood Chi Square = 0.33 with prob < NA
Tucker Lewis Index of factoring reliability = -Inf
Fit based upon off diagonal values = 1
Measures of factor score adequacy
PA1
Correlation of (regression) scores with factors 0.91
Multiple R square of scores with factors 0.83
Minimum correlation of possible factor scores 0.66
arab4 <- predict(f21, arab4 %>%
select(daesh_islam_num, daesh_goal_num, daesh_violence_num)) %>%
data.frame() %>%
mutate(support = range01(PA1)) %>%
select(support) %>%
cbind(arab4) #%>%
hist(arab4$support)

Creating indices
f1 <- arab4 %>%
select(womanwork, womenleader, womeneduc) %>%
fa(1, rotate = "promax",
fm = "pa",
scores = "regression")
fa.diagram(f1)

f1
Factor Analysis using method = pa
Call: fa(r = ., nfactors = 1, rotate = "promax", scores = "regression",
fm = "pa")
Standardized loadings (pattern matrix) based upon correlation matrix
PA1 h2 u2 com
womanwork 0.52 0.27 0.73 1
womenleader 0.44 0.19 0.81 1
womeneduc 0.51 0.26 0.74 1
PA1
SS loadings 0.72
Proportion Var 0.24
Mean item complexity = 1
Test of the hypothesis that 1 factor is sufficient.
The degrees of freedom for the null model are 3 and the objective function was 0.16 with Chi Square of 1130.34
The degrees of freedom for the model are 0 and the objective function was 0
The root mean square of the residuals (RMSR) is 0
The df corrected root mean square of the residuals is NA
The harmonic number of observations is 7069 with the empirical chi square 0.03 with prob < NA
The total number of observations was 7149 with Likelihood Chi Square = 0.02 with prob < NA
Tucker Lewis Index of factoring reliability = -Inf
Fit based upon off diagonal values = 1
Measures of factor score adequacy
PA1
Correlation of (regression) scores with factors 0.70
Multiple R square of scores with factors 0.49
Minimum correlation of possible factor scores -0.02
f2 <- arab4 %>%
select(pray, quran) %>%
fa(1, rotate = "promax",
fm = "pa",
scores = "regression")
fa.diagram(f2)

f2
Factor Analysis using method = pa
Call: fa(r = ., nfactors = 1, rotate = "promax", scores = "regression",
fm = "pa")
Standardized loadings (pattern matrix) based upon correlation matrix
PA1 h2 u2 com
pray 0.67 0.45 0.55 1
quran 0.67 0.45 0.55 1
PA1
SS loadings 0.90
Proportion Var 0.45
Mean item complexity = 1
Test of the hypothesis that 1 factor is sufficient.
The degrees of freedom for the null model are 1 and the objective function was 0.22 with Chi Square of 1602.53
The degrees of freedom for the model are -1 and the objective function was 0
The root mean square of the residuals (RMSR) is 0
The df corrected root mean square of the residuals is NA
The harmonic number of observations is 7124 with the empirical chi square 0 with prob < NA
The total number of observations was 7149 with Likelihood Chi Square = 0 with prob < NA
Tucker Lewis Index of factoring reliability = 1.001
Fit based upon off diagonal values = 1
Measures of factor score adequacy
PA1
Correlation of (regression) scores with factors 0.79
Multiple R square of scores with factors 0.62
Minimum correlation of possible factor scores 0.24
f3 <- arab4 %>%
select(nodemoc, genderapartuni, coverup) %>%
fa(1, rotate = "promax",
fm = "pa",
scores = "regression")
fa.diagram(f3)

f3
Factor Analysis using method = pa
Call: fa(r = ., nfactors = 1, rotate = "promax", scores = "regression",
fm = "pa")
Standardized loadings (pattern matrix) based upon correlation matrix
PA1 h2 u2 com
nodemoc 0.06 0.0036 1.00 1
genderapartuni 0.59 0.3463 0.65 1
coverup 0.54 0.2883 0.71 1
PA1
SS loadings 0.64
Proportion Var 0.21
Mean item complexity = 1
Test of the hypothesis that 1 factor is sufficient.
The degrees of freedom for the null model are 3 and the objective function was 0.11 with Chi Square of 784.96
The degrees of freedom for the model are 0 and the objective function was 0
The root mean square of the residuals (RMSR) is 0.02
The df corrected root mean square of the residuals is NA
The harmonic number of observations is 6741 with the empirical chi square 20.59 with prob < NA
The total number of observations was 7149 with Likelihood Chi Square = 16.56 with prob < NA
Tucker Lewis Index of factoring reliability = -Inf
Fit based upon off diagonal values = 0.99
Measures of factor score adequacy
PA1
Correlation of (regression) scores with factors 0.70
Multiple R square of scores with factors 0.48
Minimum correlation of possible factor scores -0.03
arab4 %>%
select(nodemoc, genderapartuni, coverup) %>%
KMO()
Kaiser-Meyer-Olkin factor adequacy
Call: KMO(r = .)
Overall MSA = 0.5
MSA for each item =
nodemoc genderapartuni coverup
0.46 0.50 0.50
arab4_reg <- arab4 %>%
mutate(patriarchalvalues = womanwork + womenleader + womeneduc) %>%
mutate(personalpiety = pray + quran) %>%
# mutate(islamism = scale(islamism)) %>%
# mutate_if(.predicate = is.double, scale)
mutate(liberalislam = nodemoc + genderapartuni + coverup) %>%
mutate(cntryears = paste(cntry, year))
arab4_reg$islamism <- as.numeric(range01(arab4_reg$islamism) * 100)
arab4_reg$income <- as.numeric(scale(arab4_reg$income))
arab4_reg$age <- as.numeric(scale(arab4_reg$age))
arab4_reg$educ <- as.numeric(scale(arab4_reg$educ))
arab4_reg$globalism <- as.numeric(scale(arab4_reg$globalism))
arab4_reg$personalpiety <- as.numeric(scale(arab4_reg$personalpiety))
arab4_reg$patriarchalvalues <- as.numeric(scale(arab4_reg$patriarchalvalues))
arab4_reg$liberalislam <- as.numeric(scale(arab4_reg$liberalislam))
Visualizations

all <- sjp.xtab(round(range01(arab4_reg$personalpiety)*4),
arab4_reg$symp3,
weight.by = arab4_reg$wt,
coord.flip = T,
margin = "row" )$mydf
all$cntry <- "All"
line_plots <- function(country, variable) {
arab4_reg %<>%
filter(cntry == country)
ss <- sjp.xtab(round(range01(arab4_reg$personalpiety)*4),
arab4_reg$symp3,
weight.by = arab4_reg$wt,
coord.flip = T,
margin = "row", prnt.plot = F)$mydf
ss$cntry <- country
return(ss)
}
ss <- dput(unique(arab4_reg$cntry)) %>%
map_df(line_plots) %>%
rbind(all)
c("Algeria", "Jordan", "Syrian Refugees", "Lebanon", "Morocco",
"Palestine", "Tunisia")
## Two-way frequency table on 'music' variables by sex
ss %>%
select(rowname, group, prc, n, cntry) %>%
filter(group == "X1") %>%
ggplot(aes(x = rowname, y = prc, group = cntry, color = cntry)) +
# geom_point() +
geom_line() +
facet_wrap(~cntry)
Adding missing grouping variables: `xpos`

education
## Two-way frequency table on 'music' variables by sex
ss %>%
select(rowname, group, prc, n, cntry) %>%
filter(group == "X1") %>%
ggplot(aes(x = rowname, y = prc, group = cntry, color = cntry)) +
# geom_point() +
geom_line() +
facet_wrap(~cntry, scales = "free")
Adding missing grouping variables: `xpos`

plotly::ggplotly()
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
get_data(arab4_reg = arab4_reg, whichone = arab4_reg$income, scale = 4)
c("Algeria", "Jordan", "Syrian Refugees", "Lebanon", "Morocco",
"Palestine", "Tunisia")
Error in model.frame.default(formula = weight.by ~ x_full + grp_full) :
Variablenlängen sind unterschiedlich (gefunden für 'x_full')

Linear Regressions
model0 <- arab4_reg %>%
lme4::lmer(symp2 ~ 1 + (1|cntry/year), data = .)
icc(model0)
Linear mixed model
Family: gaussian (identity)
Formula: symp2 ~ 1 + (1 | cntry/year)
ICC (year:cntry): 0.009657
ICC (cntry): 0.048077
model1 <- lme4::lmer(symp2 ~ female + work + income + age + educ + globalism + personalpiety + patriarchalvalues + liberalislam + islamism + (1|cntry), data = arab4_reg)
texreg::screenreg(model1)
====================================
Model 1
------------------------------------
(Intercept) 3.18 ***
(0.11)
female -0.03
(0.04)
work -0.07
(0.04)
income -0.02
(0.02)
age -0.00
(0.02)
educ 0.07 ***
(0.02)
globalism -0.01
(0.02)
personalpiety -0.03
(0.02)
patriarchalvalues 0.15 ***
(0.02)
liberalislam 0.00
(0.02)
islamism 0.01 ***
(0.00)
------------------------------------
AIC 15257.49
BIC 15341.60
Log Likelihood -7615.74
Num. obs. 4770
Num. groups: cntry 7
Var: cntry (Intercept) 0.07
Var: Residual 1.40
====================================
*** p < 0.001, ** p < 0.01, * p < 0.05
plot_model(model1, type = "re", sort.est = T, show.values = T, show.p = T, value.offset = 0.5)
Sorting each group of random effects ('sort.all') is not possible when 'facets = TRUE'.

#plot_model(model1, type = "std", sort.est = T, show.values = T, show.p = T, value.offset = 0.5)
sjp.lmer(model1, type = "fe.std", sort.est = T, show.values = T, show.p = T, y.offset = 0.4, p.kr = FALSE)
Computing p-values via Wald-statistics approximation (treating t as Wald z).

plot_model(model1, terms = c("liberalislam", "personalpiety"), type = "pred")
Note: uncertainty of the random effects parameters are not taken into account for confidence intervals.

Poisson Regressions
#summary(m1 <- glm(support ~ female + work + income + age + educ + globalism + personalpiety + patriarchalvalues + liberalislam, family="poisson", data=arab4_reg))
#plot_model(m1)
Logistic Regressions

LS0tDQp0aXRsZTogIkRhZXNoIEFuYWx5c2lzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyBQYWNrYWdlcw0KDQpgYGB7cn0NCiNpbnN0YWxsLnBhY2thZ2VzKCJwYWNtYW4iKQ0KI3BhY21hbjo6cF9pbnN0YWxsX2doKCJzeXN0YXRzL2Jpbm9jdWxhUiIpDQpwYWNtYW46OnBfbG9hZCh0aWR5dmVyc2UsIG1hZ3JpdHRyLCBoYXZlbiwgZ2d0aGVtZXMsIHNqUGxvdCwgc2ptaXNjLCBzanN0YXRzLCBiaW5vY3VsYVIsIGdncGxvdDIsIGdyaWQsIGdyaWRFeHRyYSwgZ3RhYmxlLCBjb3dwbG90LCBwc3ljaCwgY2FyLCBsbWU0LCBnZ3B1YnIsIHJtYXJrZG93biwgdGV4cmVnLCBNdU1JbiwgamFuaXRvciwgcGxvdGx5LCBoZXJlKQ0KDQojZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJ0aG9tYXNwODUvcGF0Y2h3b3JrIikNCnJhbmdlMDEgPC0gZnVuY3Rpb24oeCl7KHggLSBtaW4oeCwgbmEucm0gPSBUKSkgLyAobWF4KHgsIG5hLnJtID0gVCkgLSBtaW4oeCwgbmEucm0gPSBUKSl9DQoNCmBgYA0KDQojIExvYWQgaW4gRGF0YQ0KDQpgYGB7cn0NCmFyYWI0IDwtIHJlYWRfc3BzcygiZGF0YS9hcmFiNC5zYXYiKQ0KDQojIGFyYWI0IDwtIGdldChsb2FkKHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL0dvZGx5R292ZXJuYW5jZS9yYXcvbWFzdGVyL2RhdGEvYXJhYjQuUmRhdGEiKSkpDQoNCmlmZWxzZTRjYXRfcmVjIDwtIGZ1bmN0aW9uKHZhcmlhYmxlKSB7DQogIHJlY29kZWQgPC0gaWZlbHNlKHZhcmlhYmxlID09IDAgfCB2YXJpYWJsZSA+IDUsIE5BLCA1IC0gdmFyaWFibGUpDQogIHJldHVybihyZWNvZGVkKQ0KfQ0KDQoNCmBgYA0KDQoNCg0KIyBGaWx0ZXIgRGF0YQ0KDQpgYGB7cn0NCmFyYWI0ICU8PiUNCiAgZmlsdGVyKHExMDEyID09IDEpICU+JSNvbmx5IE11c2xpbXMNCiAgbXV0YXRlKHNhbXBsZSA9IGlmZWxzZShpcy5uYShzYW1wbGUpIHwgc2FtcGxlID09IDEsIDEsIDIpKSAjICU+JSANCiMgIGZpbHRlcihzYW1wbGUgIT0gMikgI29ubHkgbm9uLXJlZnVnZWVzDQoNCmBgYA0KDQoNCg0KIyBSZWNvZGluZw0KDQpgYGB7cn0NCnRhYmxlKGFyYWI0JGNvdW50cnkpDQoNCmFyYWI0ICU8PiUgDQogIG11dGF0ZShjbnRyeSA9IHNqbWlzYzo6dG9fbGFiZWwoY291bnRyeSkpICU+JSANCiAgbXV0YXRlKHJlZ2lvbiA9IHNqbWlzYzo6dG9fbGFiZWwoYTEpKSAlPiUgDQogIG11dGF0ZShnb3Zlcm5vcmF0ZSA9IHNqbWlzYzo6dG9fbGFiZWwocTEpKSAlPiUgDQogIG11dGF0ZSh5ZWFyID0gMjAxNikgJT4lIA0KICBtdXRhdGUoY250cnkgPSBjYXNlX3doZW4oDQogICAgc2FtcGxlID09IDIgfiAiU3lyaWFuIFJlZnVnZWVzIiwNCiAgICBUUlVFIH4gYXMuY2hhcmFjdGVyKGNudHJ5KQ0KICApKSAlPiUgDQogIGZpbHRlcihjbnRyeSAhPSAiRWd5cHQiKSAlPiUgDQogIG11dGF0ZShyZWdpb24gPSBzam1pc2M6OnRvX2xhYmVsKGExKSkgJT4lIA0KICBtdXRhdGUoZ292ZXJub3JhdGUgPSBzam1pc2M6OnRvX2xhYmVsKHExKSkgJT4lDQogIG11dGF0ZShkaXN0cmljdCA9IHNqbWlzYzo6dG9fbGFiZWwocTIpKSAlPiUgDQogIG11dGF0ZShkYWVzaF9yZXNwID0gZmFjdG9yKHNqbWlzYzo6dG9fbGFiZWwocTgzMSkpKSAlPiUgDQogIG11dGF0ZShkYWVzaF9yZXNwID0gY2FzZV93aGVuKA0KICAgIGRhZXNoX3Jlc3AgPT0gIkRvbid0IGtub3cgKERvIG5vdCByZWFkKSIgfiAiRG9uJ3Qga25vdyIsDQogICAgZGFlc2hfcmVzcCA9PSAiR0NDIGNvdW50cnkgKG90aGVyIHRoYW4gU2F1ZGkgQXJhYmlhKSIgfiAiT3RoZXIgR3VsZiBjb3VudHJ5IiwNCiAgICBkYWVzaF9yZXNwID09ICJEZWNsaW5lIHRvIGFuc3dlciAoRG8gbm90IHJlYWQpIiB+ICJEZWNsaW5lIHRvIGFuc3dlciIsDQogICAgVFJVRSB+IGFzLmNoYXJhY3RlcihkYWVzaF9yZXNwKQ0KICApKSAlPiUgDQogIG11dGF0ZSh0aHJlYXRfY250cnlfbnVtID0gaWZlbHNlKHE4MjYgPiA1LCBOQSwgcTgyNikpICU+JSANCiAgbXV0YXRlKHRocmVhdF9yZWdfbnVtID0gaWZlbHNlKHE4MjcgPiA1LCBOQSwgcTgyNykpICU+JSANCiAgbXV0YXRlKGRhZXNoX2lzbGFtX251bSA9IGlmZWxzZShxODI4ID4gNSwgTkEsIDUgLSBxODI4KSkgJT4lIA0KICBtdXRhdGUoZGFlc2hfZ29hbF9udW0gPSBpZmVsc2UocTgyOSA+IDUsIE5BLCA1IC0gcTgyOSkpICU+JSANCiAgbXV0YXRlKGRhZXNoX3Zpb2xlbmNlX251bSA9IGlmZWxzZShxODMwID4gNSwgTkEsIDUgLSBxODMwKSkgDQoNCg0KIyBEZXBlbmRlbnQgVmFyaWFibGUNCmFyYWI0ICU8PiUgDQogIG11dGF0ZShpc2xhbWlzdHBhcnRpZXMgPSBpZmVsc2UocTUxODIgPiA1LCBOQSwgNSAtIHE1MTgyKSkgJT4lIA0KICBtdXRhdGUoaXNsYW1pc3Rnb3YgPSBpZmVsc2UocTUxODQgPiA1LCBOQSwgNSAtIHE1MTg0KSkgJT4lIA0KICBtdXRhdGUocmVsaWdpbnRlcmZlcmUgPSBpZmVsc2UocTYwNjEgPiA1LCBOQSwgcTYwNjEpKSAlPiUgDQogIG11dGF0ZShyZWxpZ2xlYWRlcnMgPSBpZmVsc2UocTYwNjIgPiA1LCBOQSwgNSAtIHE2MDYyKSkgJT4lIA0KICBtdXRhdGUocmVsaWdsZWFkZXJzaW5mbCA9IGlmZWxzZShxNjA2MyA+IDUsIE5BLCA1IC0gcTYwNjMpKSAlPiUNCiAgbXV0YXRlKHNlcGVyYXRpb24gPSBpZmVsc2UocTYwNjQgPiA1LCBOQSwgcTYwNjQpKSAlPiUgDQogIG11dGF0ZShyZWxpZ3BhcnR5ID0gUmVjb2RlKHE2MDVhLCAiMSA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OCA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OSA9IE5BIikpICU+JSANCiAgbXV0YXRlKHJlbGlncGFydHkyID0gUmVjb2RlKHE2MDVhLCAiMSA9IDU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgPSA0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzID0gMjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgPSAzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk4ID0gTkE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTkgPSBOQSIpKQ0KDQoNCg0KYXJhYjQgJTw+JSANCiAgbXV0YXRlKGZlbWFsZSA9IGlmZWxzZShxMTAwMiA9PSAyLCAxLCAwKSkgJT4lIA0KICBtdXRhdGUod29yayA9IGlmZWxzZShxMTAwNCA9PSAwIHwgcTEwMDQgPiA1LCBOQSwgYWJzKHExMDA0IC0gMikpKSAlPiUgDQogIG11dGF0ZShpbmNvbWUgPSBpZmVsc2U0Y2F0X3JlYyhxMTAxNikpICU+JSANCiAgbXV0YXRlKGFnZSA9IGlmZWxzZShxMTAwMSA9PSAwIHwgcTEwMDEgPT0gOTk5OSwgTkEsIHExMDAxKSkgJT4lIA0KICBtdXRhdGUoZWR1YyA9IGNhc2Vfd2hlbigNCiAgICAgICAgcTEwMDMgPT0gMCB+IE5BX3JlYWxfLA0KICAgICAgICBxMTAwMyA9PSA5OCB+IE5BX3JlYWxfLA0KICAgICAgICBxMTAwMyA9PSA5OSB+IE5BX3JlYWxfLA0KICAgICAgICBxMTAwMyA9PSA1IH4gNCwNCiAgICAgICAgcTEwMDMgPT0gNiB+IDUsDQogICAgICAgIHExMDAzID09IDcgfiA2LA0KICAgICAgICB0MTAwMyA9PSAwIH4gTkFfcmVhbF8sDQogICAgICAgIHQxMDAzID09IDk4IH4gTkFfcmVhbF8sDQogICAgICAgIHQxMDAzID09IDk5IH4gTkFfcmVhbF8sDQogICAgICAgIHQxMDAzID09IDMgfiAzLA0KICAgICAgICB0MTAwMyA9PSA0IH4gNCwNCiAgICAgICAgdDEwMDMgPT0gNSB+IDUsDQogICAgICAgIHQxMDAzID09IDYgfiA2LA0KICAgIFRSVUUgfiBhcy5udW1lcmljKHExMDAzKSkNCiAgICApICU+JSANCiAgbXV0YXRlKGdsb2JhbGlzbSA9IGlmZWxzZShxNzAxYiA9PSAwIHwgcTcwMWIgPiA1LCBOQSwgcTcwMWIpKSAlPiUgDQogIG11dGF0ZShwcmF5ID0gaWZlbHNlKHE2MTAxID09IDAgfCBxNjEwMSA+IDUsIE5BLCA2IC0gcTYxMDEpKSAlPiUgDQogIG11dGF0ZShxdXJhbiA9IGlmZWxzZShxNjEwNiA9PSAwIHwgcTYxMDYgPiA1LCBOQSwgNiAtIHE2MTA2KSkgJT4lIA0KICBtdXRhdGUod29tYW53b3JrID0gaWZlbHNlKHE2MDEyID09IDAgfCBxNjAxMiA+IDUsIE5BLCBxNjAxMikpICU+JSANCiAgbXV0YXRlKHdvbWVubGVhZGVyID0gaWZlbHNlNGNhdF9yZWMocTYwMTMpKSAlPiUgDQogIG11dGF0ZSh3b21lbmVkdWMgPSBpZmVsc2U0Y2F0X3JlYyhxNjAxNCkpICU+JSANCiAgbXV0YXRlKG5vZGVtb2MgPSBpZmVsc2UocTYwNzEgPT0gMCB8IHE2MDcxID4gNSwgTkEsIHE2MDcxKSkgJT4lIA0KICBtdXRhdGUoZ2VuZGVyYXBhcnR1bmkgPSBpZmVsc2U0Y2F0X3JlYyhxNjA3NCkpICU+JSANCiAgbXV0YXRlKGNvdmVydXAgPSBpZmVsc2U0Y2F0X3JlYyhxNjA3NikpIA0KDQpgYGANCg0KIyBFeGNsdWRpbmcgSVNJUw0KDQpgYGB7cn0NCmZycShhcmFiNCAlPiUgc2VsZWN0KGRhZXNoX2lzbGFtX251bSwgZGFlc2hfZ29hbF9udW0sIGRhZXNoX3Zpb2xlbmNlX251bSkpDQoNCmFyYWI0ICU8PiUgDQogIG11dGF0ZShzeW1wID0gY2FzZV93aGVuKA0KIyAgICBkYWVzaF9pc2xhbV9udW0gPT0gMSB+IDAsDQojICAgIGRhZXNoX2lzbGFtX251bSA9PSAyIH4gMCwNCiAgICBkYWVzaF9pc2xhbV9udW0gPT0gMyB+IDEsDQogICAgZGFlc2hfaXNsYW1fbnVtID09IDQgfiAxLA0KIyAgICBkYWVzaF9nb2FsX251bSA9PSAxIH4gMCwNCiMgICAgZGFlc2hfZ29hbF9udW0gPT0gMiB+IDAsDQogICAgZGFlc2hfZ29hbF9udW0gPT0gMyB+IDEsDQogICAgZGFlc2hfZ29hbF9udW0gPT0gNCB+IDEsDQojICAgIGRhZXNoX3Zpb2xlbmNlX251bSA9PSAxIH4gMCwNCiMgICAgZGFlc2hfdmlvbGVuY2VfbnVtID09IDIgfiAwLA0KICAgIGRhZXNoX3Zpb2xlbmNlX251bSA9PSAzIH4gMSwNCiAgICBkYWVzaF92aW9sZW5jZV9udW0gPT0gNCB+IDEsDQogICAgVFJVRSB+IDANCiAgKSkgJT4lICAgDQogIG11dGF0ZShjb21wYXRpYmxlID0gY2FzZV93aGVuKA0KICAgIGRhZXNoX2lzbGFtX251bSA9PSAxIH4gMCwNCiAgICBkYWVzaF9pc2xhbV9udW0gPT0gMiB+IDAsDQogICAgZGFlc2hfaXNsYW1fbnVtID09IDMgfiAxLA0KICAgIGRhZXNoX2lzbGFtX251bSA9PSA0IH4gMSwNCiAgICBUUlVFIH4gTkFfcmVhbF8NCiAgKSkgJT4lICAgDQogIG11dGF0ZShnb2FscyA9IGNhc2Vfd2hlbigNCiAgICBkYWVzaF9nb2FsX251bSA9PSAxIH4gMCwNCiAgICBkYWVzaF9nb2FsX251bSA9PSAyIH4gMCwNCiAgICBkYWVzaF9nb2FsX251bSA9PSAzIH4gMSwNCiAgICBkYWVzaF9nb2FsX251bSA9PSA0IH4gMSwNCiAgICBUUlVFIH4gTkFfcmVhbF8NCiAgKSkgJT4lICAgDQogIG11dGF0ZSh2aW9sZW5jZSA9IGNhc2Vfd2hlbigNCiAgICBkYWVzaF92aW9sZW5jZV9udW0gPT0gMSB+IDAsDQogICAgZGFlc2hfdmlvbGVuY2VfbnVtID09IDIgfiAwLA0KICAgIGRhZXNoX3Zpb2xlbmNlX251bSA9PSAzIH4gMSwNCiAgICBkYWVzaF92aW9sZW5jZV9udW0gPT0gNCB+IDEsDQogICAgVFJVRSB+IE5BX3JlYWxfDQogICkpICU+JSAgIA0KICBtdXRhdGUoc3ltcDIgPSBkYWVzaF9pc2xhbV9udW0gKyBkYWVzaF9nb2FsX251bSArIGRhZXNoX3Zpb2xlbmNlX251bSkgJT4lIA0KICBtdXRhdGUoc3ltcDMgPSBpZmVsc2Uoc3ltcDIgPj0gNSwgMSwgMCkpICU+JSANCiAgc2VsZWN0KGNudHJ5LCB5ZWFyLCByZWdpb24sIGdvdmVybm9yYXRlICwgaXNsYW1pc3RwYXJ0aWVzICwgaXNsYW1pc3Rnb3YsIHJlbGlnaW50ZXJmZXJlLCByZWxpZ2xlYWRlcnMsIHJlbGlnbGVhZGVyc2luZmwsIHNlcGVyYXRpb24sIHJlbGlncGFydHksIHJlbGlncGFydHkyLCBmZW1hbGUsIHdvcmssIGluY29tZSwgIGFnZSwgZWR1YywgZ2xvYmFsaXNtLCBwcmF5LCBxdXJhbiwgd29tYW53b3JrLCB3b21lbmxlYWRlciwgd29tZW5lZHVjLCBub2RlbW9jLCBnZW5kZXJhcGFydHVuaSwgY292ZXJ1cCwgZGFlc2hfaXNsYW1fbnVtLCBkYWVzaF9nb2FsX251bSwgZGFlc2hfdmlvbGVuY2VfbnVtLCBzeW1wLCBzeW1wMiwgc3ltcDMsIHd0LCBjb21wYXRpYmxlLCBnb2FscywgdmlvbGVuY2UpICMlPiUgDQojICBmaWx0ZXIoZGFlc2hfaXNsYW1fbnVtID49IDMgfCBkYWVzaF9nb2FsX251bSA+PSAzIHwgZGFlc2hfdmlvbGVuY2VfbnVtID49IDMpICU+JSANCiMgIHNlbGVjdChkYWVzaF9pc2xhbV9udW0sIGRhZXNoX2dvYWxfbnVtLCBkYWVzaF92aW9sZW5jZV9udW0sIHN5bXAsIHN5bXAyLCBzeW1wMykgJT4lIA0KIyAgZnJxKCkNCg0KYXJhYjQgJT4lIA0KICBzZWxlY3QoZGFlc2hfaXNsYW1fbnVtLCBkYWVzaF9nb2FsX251bSwgZGFlc2hfdmlvbGVuY2VfbnVtLCBjbnRyeSkgJT4lIA0KICBuYS5vbWl0KCkgJT4lIA0KICBzZWxlY3QoY250cnkpICU+JSANCiAgdGFibGUoKQ0KDQoNCmFyYWI0ICU+JSANCiAgc2VsZWN0KGNvbXBhdGlibGUsIGdvYWxzLCB2aW9sZW5jZSwgY250cnkpICU+JSANCiAgZnJxKCkNCmBgYA0KDQojIEZhY3RvciBBbmFseXNpcw0KDQpgYGB7cn0NCmYzMSA8LSBhcmFiNCAlPiUgDQogIHNlbGVjdChpc2xhbWlzdHBhcnRpZXMsIGlzbGFtaXN0Z292LCANCiAgICAgICAgIHJlbGlnbGVhZGVycywgcmVsaWdsZWFkZXJzaW5mbCkgJT4lIA0KICBmYSgxLCByb3RhdGUgPSAicHJvbWF4IiwgICANCiAgICAgICAgZm0gPSAicGEiLA0KICAgICAgICBzY29yZXMgPSAicmVncmVzc2lvbiIpICAgICAgICAgICANCmZhLmRpYWdyYW0oZjMxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmYzMSAgICAgICAgICAgICAgDQoNCmFyYWI0IDwtIHByZWRpY3QoZjMxLCBhcmFiNCAlPiUgDQogIHNlbGVjdChpc2xhbWlzdHBhcnRpZXMsIGlzbGFtaXN0Z292LCANCiAgICAgICAgIHJlbGlnbGVhZGVycywgcmVsaWdsZWFkZXJzaW5mbCkpICU+JSANCiAgZGF0YS5mcmFtZSgpICU+JSANCiAgcmVuYW1lKGlzbGFtaXNtID0gUEExKSAlPiUgDQogIGNiaW5kKGFyYWI0KSANCiMlPiUgDQojICBnZ3Bsb3QoYWVzKGlzbGFtaXNtKSkgKw0KIyAgZ2VvbV9oaXN0b2dyYW0oKSArDQojICBmYWNldF93cmFwKH5jbnRyeSwgc2NhbGVzID0gImZyZWUiKQ0KDQojc2pQbG90Ojp2aWV3X2RmKGFyYWIsIHNob3cuZnJxID0gVCwgc2hvdy5wcmMgPSBUKQ0KDQoNCmYyMSA8LSBhcmFiNCAlPiUgDQogIHNlbGVjdChkYWVzaF9pc2xhbV9udW0sIGRhZXNoX2dvYWxfbnVtLCBkYWVzaF92aW9sZW5jZV9udW0pICU+JSANCiAgZmEoMSwgcm90YXRlID0gInByb21heCIsICAgDQogICAgICAgIGZtID0gInBhIiwNCiAgICAgICAgc2NvcmVzID0gInJlZ3Jlc3Npb24iKSAgICAgICAgICAgDQpmYS5kaWFncmFtKGYyMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpmMjEgICAgICAgICAgICAgIA0KDQphcmFiNCA8LSBwcmVkaWN0KGYyMSwgYXJhYjQgJT4lIA0KICBzZWxlY3QoZGFlc2hfaXNsYW1fbnVtLCBkYWVzaF9nb2FsX251bSwgZGFlc2hfdmlvbGVuY2VfbnVtKSkgJT4lIA0KICBkYXRhLmZyYW1lKCkgJT4lIA0KICBtdXRhdGUoc3VwcG9ydCA9IHJhbmdlMDEoUEExKSkgJT4lIA0KICBzZWxlY3Qoc3VwcG9ydCkgJT4lIA0KICBjYmluZChhcmFiNCkgICMlPiUgDQoNCmhpc3QoYXJhYjQkc3VwcG9ydCkNCmBgYA0KDQojIENyZWF0aW5nIGluZGljZXMNCg0KYGBge3J9DQpmMSA8LSBhcmFiNCAlPiUgDQogIHNlbGVjdCh3b21hbndvcmssIHdvbWVubGVhZGVyLCB3b21lbmVkdWMpICU+JSANCiAgZmEoMSwgcm90YXRlID0gInByb21heCIsICAgDQogICAgICAgIGZtID0gInBhIiwNCiAgICAgICAgc2NvcmVzID0gInJlZ3Jlc3Npb24iKSAgICAgICAgICAgDQpmYS5kaWFncmFtKGYxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmYxICAgICAgICANCg0KZjIgPC0gYXJhYjQgJT4lIA0KICBzZWxlY3QocHJheSwgcXVyYW4pICU+JSANCiAgZmEoMSwgcm90YXRlID0gInByb21heCIsICAgDQogICAgICAgIGZtID0gInBhIiwNCiAgICAgICAgc2NvcmVzID0gInJlZ3Jlc3Npb24iKSAgICAgICAgICAgDQpmYS5kaWFncmFtKGYyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmYyICAgIA0KDQpmMyA8LSBhcmFiNCAlPiUgDQogIHNlbGVjdChub2RlbW9jLCBnZW5kZXJhcGFydHVuaSwgY292ZXJ1cCkgJT4lIA0KICBmYSgxLCByb3RhdGUgPSAicHJvbWF4IiwgICANCiAgICAgICAgZm0gPSAicGEiLA0KICAgICAgICBzY29yZXMgPSAicmVncmVzc2lvbiIpICAgICAgICAgICANCmZhLmRpYWdyYW0oZjMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KZjMgICAgDQoNCmFyYWI0ICU+JSANCiAgc2VsZWN0KG5vZGVtb2MsIGdlbmRlcmFwYXJ0dW5pLCBjb3ZlcnVwKSAlPiUgDQogIEtNTygpDQoNCg0KYXJhYjRfcmVnIDwtIGFyYWI0ICU+JSANCiAgbXV0YXRlKHBhdHJpYXJjaGFsdmFsdWVzID0gd29tYW53b3JrICsgd29tZW5sZWFkZXIgKyB3b21lbmVkdWMpICAlPiUgDQogIG11dGF0ZShwZXJzb25hbHBpZXR5ID0gcHJheSArIHF1cmFuKSAlPiUgDQojIG11dGF0ZShpc2xhbWlzbSA9IHNjYWxlKGlzbGFtaXNtKSkgJT4lIA0KIyAgbXV0YXRlX2lmKC5wcmVkaWNhdGUgPSBpcy5kb3VibGUsIHNjYWxlKSANCiAgbXV0YXRlKGxpYmVyYWxpc2xhbSA9IG5vZGVtb2MgKyBnZW5kZXJhcGFydHVuaSArIGNvdmVydXApICU+JSANCiAgbXV0YXRlKGNudHJ5ZWFycyA9IHBhc3RlKGNudHJ5LCB5ZWFyKSkNCg0KDQphcmFiNF9yZWckaXNsYW1pc20gPC0gYXMubnVtZXJpYyhyYW5nZTAxKGFyYWI0X3JlZyRpc2xhbWlzbSkgKiAxMDApDQoNCmFyYWI0X3JlZyRpbmNvbWUgICAgICAgICAgICAgPC0gYXMubnVtZXJpYyhzY2FsZShhcmFiNF9yZWckaW5jb21lKSkNCmFyYWI0X3JlZyRhZ2UgICAgICAgICAgICAgICAgPC0gYXMubnVtZXJpYyhzY2FsZShhcmFiNF9yZWckYWdlKSkNCmFyYWI0X3JlZyRlZHVjICAgICAgICAgICAgICAgPC0gYXMubnVtZXJpYyhzY2FsZShhcmFiNF9yZWckZWR1YykpIA0KYXJhYjRfcmVnJGdsb2JhbGlzbSAgICAgICAgICA8LSBhcy5udW1lcmljKHNjYWxlKGFyYWI0X3JlZyRnbG9iYWxpc20pKSAgIA0KYXJhYjRfcmVnJHBlcnNvbmFscGlldHkgICAgICA8LSBhcy5udW1lcmljKHNjYWxlKGFyYWI0X3JlZyRwZXJzb25hbHBpZXR5KSkgICAgICAgDQphcmFiNF9yZWckcGF0cmlhcmNoYWx2YWx1ZXMgIDwtIGFzLm51bWVyaWMoc2NhbGUoYXJhYjRfcmVnJHBhdHJpYXJjaGFsdmFsdWVzKSkgICAgICAgICAgIA0KYXJhYjRfcmVnJGxpYmVyYWxpc2xhbSAgICAgICA8LSBhcy5udW1lcmljKHNjYWxlKGFyYWI0X3JlZyRsaWJlcmFsaXNsYW0pKSAgICAgDQoNCmBgYA0KIyBWaXN1YWxpemF0aW9ucw0KDQpgYGB7cn0NCnRhYmxlKGFyYWI0X3JlZyRpbmNvbWUpDQoNCnQudGVzdChhcmFiNF9yZWckbGliZXJhbGlzbGFtIH4gYXJhYjRfcmVnJHN5bXApDQoNCg0KZ2d2aW9saW4oYXJhYjRfcmVnLCB4ID0gInN5bXAzIiwgeSA9ICJwZXJzb25hbHBpZXR5IiwNCiAgICAgICAgICAgICAgICBjb2xvciA9ICJzeW1wMyIsIHBhbGV0dGUgPWMoIiMwMEFGQkIiLCAiI0U3QjgwMCIpLA0KICAgICAgICAgICAgICAgICBzaGFwZSA9ICJzeW1wMyIpDQoNCmNudHJ5cyA8LSBjKCJBbGdlcmlhIiwgIkpvcmRhbiIsICJMZWJhbm9uIiwgIk1vcm9jY28iLCAiUGFsZXN0aW5lIiwgIlR1bmlzaWEiLCAiU3lyaWFuIFJlZnVnZWVzIikNCg0Kc3MgPC0gbGlzdCgpDQpmb3IgKGpqIGluIGNudHJ5cykgew0Kc3NbW2pqXV0gPC0gYXJhYjRfcmVnICU+JSANCiAgZmlsdGVyKGNudHJ5ID09IGpqKSAlPiUgIA0KICBzZWxlY3QoY250cnksIHBlcnNvbmFscGlldHksIHN5bXAzKSAlPiUgDQogIG5hLm9taXQoKSAlPiUgDQpnZ3Zpb2xpbih4ID0gInN5bXAzIiwgeSA9ICJwZXJzb25hbHBpZXR5IiwgZmlsbCA9ICJzeW1wMyIsDQogICAgICAgICBwYWxldHRlID0gYygiIzAwQUZCQiIsICIjRTdCODAwIiksDQogICAgICAgICBhZGQgPSAiYm94cGxvdCIsIGFkZC5wYXJhbXMgPSBsaXN0KGZpbGwgPSAid2hpdGUiKSkgKw0KICBzdGF0X2NvbXBhcmVfbWVhbnMobGFiZWwueSA9IDIpICsgZ2d0aXRsZShqaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFkZCBnbG9iYWwgdGhlIHAtdmFsdWUgDQp9DQoNCnNzDQoNCnRhYmxlKGFyYWI0JHN5bXApDQojDQojYXJhYjRfcmVnICU+JSANCiMgIG11dGF0ZShzeW1wID0gYXMuZmFjdG9yKHN5bXApKSAlPiUgDQojZ2diYXJwbG90KHggPSAic3ltcCIsIHkgPSAicGVyc29uYWxwaWV0eSIsDQojICAgICAgICAgIyBmaWxsID0gInN5bXAiLCAgICAgICAgICAgIyBjaGFuZ2UgZmlsbCBjb2xvciBieSBtcGdfbGV2ZWwNCiMgICAgICAgICAgY29sb3IgPSAid2hpdGUiLCAgICAgICAgICAgICMgU2V0IGJhciBib3JkZXIgY29sb3JzIHRvIHdoaXRlDQojICAgICAgICAgIHBhbGV0dGUgPSAiamNvIiwgICAgICAgICAgICAjIGpjbyBqb3VybmFsIGNvbG9yIHBhbGV0dC4gc2VlID9nZ3Bhcg0KIyAgICAgICAgICBzb3J0LnZhbCA9ICJhc2MiLCAgICAgICAgICAgIyBTb3J0IHRoZSB2YWx1ZSBpbiBhc2NlbmRpbmcgb3JkZXINCiMgICAgICAgICAgc29ydC5ieS5ncm91cHMgPSBGQUxTRSwgICAgICMgRG9uJ3Qgc29ydCBpbnNpZGUgZWFjaCBncm91cA0KIyAgICAgICAgICB4LnRleHQuYW5nbGUgPSA5MCwgICAgICAgICAgIyBSb3RhdGUgdmVydGljYWxseSB4IGF4aXMgdGV4dHMNCiMgICAgICAgICAgeWxhYiA9ICJNUEcgei1zY29yZSIsDQojICAgICAgICAgIHhsYWIgPSBGQUxTRSwNCiMgICAgICAgICAgbGVnZW5kLnRpdGxlID0gIk1QRyBHcm91cCINCiMgICAgICAgICAgKQ0KIw0KYXJhYjRfcmVnICU+JSANCiMgIHNlbGVjdChlZHVjLCBzeW1wMikgJT4lIA0KICBnZ3Bsb3QoYWVzKGluY29tZSwgc3ltcDIpKSArIA0KIyAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikNCg0KYXJhYjRfcmVnICU+JSANCiAgbXV0YXRlKHN5bXAgPSBhcy5mYWN0b3Ioc3ltcCkpICU+JSANCmdnc2NhdHRlcih4ID0gInBlcnNvbmFscGlldHkiLCB5ID0gInN5bXAyIiwNCiAgIGNvbG9yID0gInN5bXAiICwgc2hhcGUgPSAyMSwgc2l6ZSA9IDMsICMgUG9pbnRzIGNvbG9yLCBzaGFwZSBhbmQgc2l6ZQ0KICAgYWRkID0gInJlZy5saW5lIiwgICMgQWRkIHJlZ3Jlc3NpbiBsaW5lDQogICBhZGQucGFyYW1zID0gbGlzdChjb2xvciA9ICJibHVlIiwgZmlsbCA9ICJsaWdodGdyYXkiKSwgIyBDdXN0b21pemUgcmVnLiBsaW5lDQogICBjb25mLmludCA9IFRSVUUsICMgQWRkIGNvbmZpZGVuY2UgaW50ZXJ2YWwNCiAgIGNvci5jb2VmID0gVFJVRSwgIyBBZGQgY29ycmVsYXRpb24gY29lZmZpY2llbnQuIHNlZSA/c3RhdF9jb3INCiAgIGNvci5jb2VmZi5hcmdzID0gbGlzdChtZXRob2QgPSAicGVhcnNvbiIsIGxhYmVsLnggPSAzLCBsYWJlbC5zZXAgPSAiXG4iKSwgIGZhY2V0LmJ5ID0gImNudHJ5Ig0KICAgKQ0KDQoNCiAgYXJhYjRfcmVnICU+JSANCiMgIHNlbGVjdChlZHVjLCBzeW1wMikgJT4lIA0KICBnZ3Bsb3QoYWVzKGlzbGFtaXNtLCBzeW1wMikpICsgDQojICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArDQogICAgZmFjZXRfd3JhcCh+Y250cnkpICsgc3RhdF9jb3IoKQ0KICANCiAgcGFjbWFuOjpwX2xvYWQoInlhcnJyIikNCiAgcGlyYXRlcGxvdChmb3JtdWxhID0gc3VwcG9ydCB+IHJvdW5kKG5vZGVtb2MpLA0KICAgICAgICAgICBkYXRhID0gYXJhYjRfcmVnLA0KICAgICAgICAgICBtYWluID0gIkZ1bGx5IGN1c3RvbWl6ZWQgcGlyYXRlcGxvdCIsDQogICAgICAgICAgIHBhbCA9ICJzb3V0aHBhcmsiLCAjIHNvdXRocGFyayBjb2xvciBwYWxldHRlDQogICAgICAgICAgIGJlYW4uZi5vID0gLjAsICMgQmVhbiBmaWxsDQogICAgICAgICAgIHBvaW50Lm8gPSAuMCwgIyBQb2ludHMNCiAgICAgICAgICAgaW5mLmYubyA9IC43LCAjIEluZmVyZW5jZSBmaWxsDQogICAgICAgICAgIGluZi5iLm8gPSAuMCwgIyBJbmZlcmVuY2UgYm9yZGVyDQogICAgICAgICAgIGF2Zy5saW5lLm8gPSAxLCAjIEF2ZXJhZ2UgbGluZQ0KICAgICAgICAgICBiYXIuZi5vID0gLjUsICMgQmFyDQogICAgICAgICAgIGluZi5mLmNvbCA9ICJ3aGl0ZSIsICMgSW5mIGZpbGwgY29sDQogICAgICAgICAgIGluZi5iLmNvbCA9ICJibGFjayIsICMgSW5mIGJvcmRlciBjb2wNCiAgICAgICAgICAgYXZnLmxpbmUuY29sID0gImJsYWNrIiwgIyBhdmcgbGluZSBjb2wNCiAgICAgICAgICAgYmFyLmYuY29sID0gZ3JheSguOCksICMgYmFyIGZpbGxpbmcgY29sb3INCiAgICAgICAgICAgcG9pbnQucGNoID0gMjEsDQogICAgICAgICAgIHBvaW50LmJnID0gIndoaXRlIiwNCiAgICAgICAgICAgcG9pbnQuY29sID0gImJsYWNrIiwNCiAgICAgICAgICAgcG9pbnQuY2V4ID0gLjcpDQogIA0KICANCmFyYWI0X3JlZyAlPiUgDQogIGdncGxvdChhZXMoZmFjdG9yKHN5bXApLCBwZXJzb25hbHBpZXR5KSkgKw0KICBnZW9tX2JveHBsb3QoKQ0KDQoNCiAgcGlyYXRlcGxvdChmb3JtdWxhID0gc3ltcDMgfiByb3VuZChwZXJzb25hbHBpZXR5KSwNCiAgICAgICAgICAgZGF0YSA9IGFyYWI0X3JlZywNCiAgICAgICAgICAgbWFpbiA9ICJSZWR1Y2luZyBhIHBpcmF0ZXBsb3QgdG8gYSBiYXJwbG90IiwNCiAgICAgICAgICAgdGhlbWUgPSAwLCAjIFN0YXJ0IGZyb20gc2NyYXRjaA0KICAgICAgICAgICBiYXIuZi5vID0gLjcpICMgSnVzdCB0dXJuIG9uIHRoZSBiYXJzDQogIA0KDQogIA0Kc3MgPC0gc2p0Lnh0YWIocm91bmQoYXJhYjRfcmVnJHBlcnNvbmFscGlldHkpLCANCiAgICAgICAgIGFyYWI0X3JlZyRzeW1wLCANCiAgICAgICAgIHdlaWdodC5ieSA9IGFyYWI0X3JlZyR3dCwgDQogICAgICAgICBzaG93LnJvdy5wcmMgPSBULHNob3cuY29sLnByYyA9IFQpDQoNCg0KIyBhcmFiNF9yZWcgJT4lIA0KIyAgIG11dGF0ZShwZXJjX3N1cHBvcnQgPSApDQojIA0KIyBwcm9wLnRhYmxlKGFyYWI0X3JlZyRzeW1wMykNCiMgDQojICBwcm9wLnRhYmxlKHN0YXRzOjp4dGFicyhhcmFiNF9yZWckd3QgfiAjIGFyYWI0X3JlZyRwZXJzb25hbHBpZXR5KSkNCiMgICBwcm9wLnRhYmxlKHN0YXRzOjp4dGFicyhhcmFiNF9yZWckd3QgfiBhcmFiNF9yZWckc3ltcDMpKQ0KIyANCiMgamFuaXRvcjo6Y3Jvc3N0YWIoYXJhYjRfcmVnJHN5bXAzLCAjIHJvdW5kKHJhbmdlMDEoYXJhYjRfcmVnJHBlcnNvbmFscGlldHkpKjQpKQ0KIyANCiMgI2luc3RhbGwucGFja2FnZXMoInF1ZXN0aW9uciIpDQojIGxpYnJhcnkoZGVzY3IpDQojIHNzIDwtIGNyb3NzdGFiKGFyYWI0X3JlZyRzeW1wMywgIyByb3VuZChyYW5nZTAxKGFyYWI0X3JlZyRwZXJzb25hbHBpZXR5KSo0KSwgd2VpZ2h0ID0gIyBhcmFiNF9yZWckd3QpICU+JSBhcy5kYXRhLmZyYW1lLmNvbXBsZXgoKSAlPiUgdGJsX2RmDQojIA0KIyANCiMgcGVyY19kYXQgPC0gcXVlc3Rpb25yOjp3dGQudGFibGUoYXJhYjRfcmVnJHN5bXAzLCANCiMgICAgICAgICAgICAgICAgICAgICAgIyByb3VuZChyYW5nZTAxKGFyYWI0X3JlZyRwZXJzb25hbHBpZXR5KSo0KSwgDQojICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSBhcmFiNF9yZWckd3QpICU+JSANCiMgICB0KCkgJT4lIA0KIyAgIGFzLmRhdGEuZnJhbWUubWF0cml4KCkgJT4lIA0KIyAgIGNiaW5kKHJvd19zdW1zKHBlcmNfZGF0KSkgJT4lDQojICAgbXV0YXRlKHN1cHBfcGVyYyA9IGAxYC9yb3dzdW1zKQ0KIyAgIG11dGF0ZShwZXJzb25hbHBpZXR5ID0gMDo0KSAjJT4lIA0KIyAjJT4lIA0KIyAgICNnYXRoZXIoInBlcnNvbmFseXBpZXR5IiwgInRvdGFsIiwgLXN1cHBvcnQpIA0KIyAjDQojICNhcmFiNF9yZWcgJT4lIA0KIyAjICBzZWxlY3Qoc3ltcDMsIHBlcnNvbmFscGlldHksIHd0KSAlPiUgDQojICMgIGdyb3VwX2J5KHN5bXAzLCBwZXJzb25hbHBpZXR5KSAlPiUNCiMgIyAgc3VtbWFyaXNlKGNvdW50X3cgPSBzdW0od3QpKSAlPiUNCiMgIyAgbXV0YXRlKGZyZXEgPSBjb3VudF93L3N1bShjb3VudF93KSkgICU+JSANCiMgIyAgbmEub21pdCgpDQojIA0KIyBxdWVzdGlvbnI6OmNyb3NzLm11bHRpLnRhYmxlKGRmID0gYXJhYjRfcmVnICU+JSAgIyBzZWxlY3QoYWdlLCB3b3JrKSwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3N2YXIgPSAjIGFzLm51bWVyaWMoYXJhYjRfcmVnJHN5bXAzKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzID0gIyBhcy5udW1lcmljKGFyYWI0X3JlZyR3dCksIGZyZXEgPSBULCB0ZnJlcSA9ICJyb3ciKQ0KDQphbGwgPC0gc2pwLnh0YWIocm91bmQocmFuZ2UwMShhcmFiNF9yZWckcGVyc29uYWxwaWV0eSkqNCksIA0KICAgICAgICAgICAgICAgYXJhYjRfcmVnJHN5bXAzLA0KICAgICAgICAgICAgICAgd2VpZ2h0LmJ5ID0gYXJhYjRfcmVnJHd0LCANCiAgICAgICAgICAgICAgIGNvb3JkLmZsaXAgPSBULCANCiAgICAgICAgICAgICAgIG1hcmdpbiA9ICJyb3ciICkkbXlkZg0KYWxsJGNudHJ5IDwtICJBbGwiDQoNCmxpbmVfcGxvdHMgPC0gZnVuY3Rpb24oY291bnRyeSwgdmFyaWFibGUpIHsNCg0KICBhcmFiNF9yZWcgJTw+JSANCiAgICBmaWx0ZXIoY250cnkgPT0gY291bnRyeSkNCnNzIDwtIHNqcC54dGFiKHJvdW5kKHJhbmdlMDEoYXJhYjRfcmVnJHBlcnNvbmFscGlldHkpKjQpLA0KICAgICAgICAgICAgICAgYXJhYjRfcmVnJHN5bXAzLA0KICAgICAgICAgICAgICAgd2VpZ2h0LmJ5ID0gYXJhYjRfcmVnJHd0LCANCiAgICAgICAgICAgICAgIGNvb3JkLmZsaXAgPSBULCANCiAgICAgICAgICAgICAgIG1hcmdpbiA9ICJyb3ciLCBwcm50LnBsb3QgPSBGKSRteWRmDQpzcyRjbnRyeSA8LSBjb3VudHJ5DQpyZXR1cm4oc3MpDQp9DQoNCnNzIDwtIGRwdXQodW5pcXVlKGFyYWI0X3JlZyRjbnRyeSkpICU+JSANCiAgbWFwX2RmKGxpbmVfcGxvdHMpICU+JSANCiAgcmJpbmQoYWxsKQ0KDQoNCg0KIyMgVHdvLXdheSBmcmVxdWVuY3kgdGFibGUgb24gJ211c2ljJyB2YXJpYWJsZXMgYnkgc2V4DQpzcyAlPiUgDQogIHNlbGVjdChyb3duYW1lLCBncm91cCwgcHJjLCBuLCBjbnRyeSkgJT4lIA0KICBmaWx0ZXIoZ3JvdXAgPT0gIlgxIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSByb3duYW1lLCB5ID0gcHJjLCBncm91cCA9IGNudHJ5LCBjb2xvciA9IGNudHJ5KSkgKw0KIyAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBmYWNldF93cmFwKH5jbnRyeSkNCg0KDQoNCnBsb3RseTo6Z2dwbG90bHkoKQ0KDQp0YWJsZShhcmFiNF9yZWckZWR1YykNCmBgYA0KIyBlZHVjYXRpb24NCg0KYGBge3J9DQoNCg0KYWxsIDwtIHNqcC54dGFiKHJvdW5kKHJhbmdlMDEoYXJhYjRfcmVnJGVkdWMpKjYpLCANCiAgICAgICAgICAgICAgIGFyYWI0X3JlZyRzeW1wMywNCiAgICAgICAgICAgICAgIHdlaWdodC5ieSA9IGFyYWI0X3JlZyR3dCwgDQogICAgICAgICAgICAgICBjb29yZC5mbGlwID0gVCwgDQogICAgICAgICAgICAgICBtYXJnaW4gPSAicm93IiApJG15ZGYNCmFsbCRjbnRyeSA8LSAiQWxsIg0KDQpsaW5lX3Bsb3RzIDwtIGZ1bmN0aW9uKGNvdW50cnksIHZhcmlhYmxlKSB7DQoNCiAgYXJhYjRfcmVnICU8PiUgDQogICAgZmlsdGVyKGNudHJ5ID09IGNvdW50cnkpDQpzcyA8LSBzanAueHRhYihyb3VuZChyYW5nZTAxKGFyYWI0X3JlZyRlZHVjKSo2KSwNCiAgICAgICAgICAgICAgIGFyYWI0X3JlZyRzeW1wMywNCiAgICAgICAgICAgICAgIHdlaWdodC5ieSA9IGFyYWI0X3JlZyR3dCwgDQogICAgICAgICAgICAgICBjb29yZC5mbGlwID0gVCwgDQogICAgICAgICAgICAgICBtYXJnaW4gPSAicm93IiwgcHJudC5wbG90ID0gRikkbXlkZg0Kc3MkY250cnkgPC0gY291bnRyeQ0KcmV0dXJuKHNzKQ0KfQ0KDQpzcyA8LSBkcHV0KHVuaXF1ZShhcmFiNF9yZWckY250cnkpKSAlPiUgDQogIG1hcF9kZihsaW5lX3Bsb3RzKSAlPiUgDQogIHJiaW5kKGFsbCkNCg0KDQoNCiMjIFR3by13YXkgZnJlcXVlbmN5IHRhYmxlIG9uICdtdXNpYycgdmFyaWFibGVzIGJ5IHNleA0Kc3MgJT4lIA0KICBzZWxlY3Qocm93bmFtZSwgZ3JvdXAsIHByYywgbiwgY250cnkpICU+JSANCiAgZmlsdGVyKGdyb3VwID09ICJYMSIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcm93bmFtZSwgeSA9IHByYywgZ3JvdXAgPSBjbnRyeSwgY29sb3IgPSBjbnRyeSkpICsNCiMgIGdlb21fcG9pbnQoKSArDQogIGdlb21fbGluZSgpICsgDQogIGZhY2V0X3dyYXAofmNudHJ5LCBzY2FsZXMgPSAiZnJlZSIpDQoNCnBsb3RseTo6Z2dwbG90bHkoKQ0KYGBgDQoNCmBgYHtyfQ0KZ2V0X2RhdGEgPC0gZnVuY3Rpb24oYXJhYjRfcmVnLCB3aGljaG9uZSwgc2NhbGUpIHsNCiAgDQphbGwgPC0gc2pwLnh0YWIocm91bmQocmFuZ2UwMSh3aGljaG9uZSkqc2NhbGUpLCANCiAgICAgICAgICAgICAgIGFyYWI0X3JlZyRzeW1wMywNCiAgICAgICAgICAgICAgIHdlaWdodC5ieSA9IGFyYWI0X3JlZyR3dCwgDQogICAgICAgICAgICAgICBjb29yZC5mbGlwID0gVCwgDQogICAgICAgICAgICAgICBtYXJnaW4gPSAicm93IiApJG15ZGYNCmFsbCRjbnRyeSA8LSAiQWxsIg0KDQpsaW5lX3Bsb3RzIDwtIGZ1bmN0aW9uKGNvdW50cnkpIHsNCiAgd2hpY2hvbmUgPC0gd2hpY2hvbmUNCg0KYXJhYjRfcmVnICU8PiUgDQogICAgZmlsdGVyKGNudHJ5ID09IGNvdW50cnkpDQpzcyA8LSBzanAueHRhYihyb3VuZChyYW5nZTAxKHdoaWNob25lKSpzY2FsZSksDQogICAgICAgICAgICAgICBhcmFiNF9yZWckc3ltcDMsDQogICAgICAgICAgICAgICB3ZWlnaHQuYnkgPSBhcmFiNF9yZWckd3QsIA0KICAgICAgICAgICAgICAgY29vcmQuZmxpcCA9IFQsIA0KICAgICAgICAgICAgICAgbWFyZ2luID0gInJvdyIsIHBybnQucGxvdCA9IEYpJG15ZGYNCnNzJGNudHJ5IDwtIGNvdW50cnkNCnJldHVybihzcykNCn0NCg0Kc3MgPC0gZHB1dCh1bmlxdWUoYXJhYjRfcmVnJGNudHJ5KSkgJT4lIA0KICBtYXBfZGYobGluZV9wbG90cykgJT4lIA0KICByYmluZChhbGwpDQoNCnJldHVybihzcykNCn0NCg0KZ2V0X2RhdGEoYXJhYjRfcmVnID0gYXJhYjRfcmVnLCB3aGljaG9uZSA9IGFyYWI0X3JlZyRpbmNvbWUsIHNjYWxlID0gNCkNCg0KdGFibGUoYXJhYjRfcmVnJG5vZGVtb2MpDQpgYGANCg0KDQojIExpbmVhciBSZWdyZXNzaW9ucw0KDQpgYGB7cn0NCm1vZGVsMCA8LSBhcmFiNF9yZWcgJT4lIA0KICBsbWU0OjpsbWVyKHN5bXAyIH4gMSArICgxfGNudHJ5L3llYXIpLCBkYXRhID0gLikNCg0KaWNjKG1vZGVsMCkNCg0KbW9kZWwxIDwtIGxtZTQ6OmxtZXIoc3ltcDIgfiBmZW1hbGUgKyB3b3JrICsgaW5jb21lICsgYWdlICsgZWR1YyArIGdsb2JhbGlzbSArIHBlcnNvbmFscGlldHkgKyBwYXRyaWFyY2hhbHZhbHVlcyArIGxpYmVyYWxpc2xhbSArIGlzbGFtaXNtICsgKDF8Y250cnkpLCBkYXRhID0gYXJhYjRfcmVnKQ0KDQp0ZXhyZWc6OnNjcmVlbnJlZyhtb2RlbDEpDQoNCnBsb3RfbW9kZWwobW9kZWwxLCB0eXBlID0gInJlIiwgc29ydC5lc3QgPSBULCBzaG93LnZhbHVlcyA9IFQsIHNob3cucCA9IFQsIHZhbHVlLm9mZnNldCA9IDAuNSkNCg0KI3Bsb3RfbW9kZWwobW9kZWwxLCB0eXBlID0gInN0ZCIsIHNvcnQuZXN0ID0gVCwgc2hvdy52YWx1ZXMgPSBULCBzaG93LnAgPSBULCB2YWx1ZS5vZmZzZXQgPSAwLjUpDQoNCnNqcC5sbWVyKG1vZGVsMSwgdHlwZSA9ICJmZS5zdGQiLCBzb3J0LmVzdCA9IFQsIHNob3cudmFsdWVzID0gVCwgc2hvdy5wID0gVCwgeS5vZmZzZXQgPSAwLjQsIHAua3IgPSBGQUxTRSkNCg0KcGxvdF9tb2RlbChtb2RlbDEsIHRlcm1zID0gYygibGliZXJhbGlzbGFtIiwgInBlcnNvbmFscGlldHkiKSwgdHlwZSA9ICJwcmVkIikNCg0KYGBgDQoNCiMgUG9pc3NvbiBSZWdyZXNzaW9ucw0KDQpgYGB7cn0NCiNzdW1tYXJ5KG0xIDwtIGdsbShzdXBwb3J0IH4gZmVtYWxlICsgd29yayArIGluY29tZSArIGFnZSArIGVkdWMgKyBnbG9iYWxpc20gKyBwZXJzb25hbHBpZXR5ICsgcGF0cmlhcmNoYWx2YWx1ZXMgKyBsaWJlcmFsaXNsYW0sIGZhbWlseT0icG9pc3NvbiIsIGRhdGE9YXJhYjRfcmVnKSkNCg0KI3Bsb3RfbW9kZWwobTEpDQpgYGANCg0KDQojIExvZ2lzdGljIFJlZ3Jlc3Npb25zDQoNCmBgYHtyfQ0KZml0MSA8LSBnbG1lcihzeW1wIH4gMSArKDF8Y250cnkpLCBkYXRhID0gYXJhYjRfcmVnLA0KICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbCgibG9naXQiKSkNCg0KaWNjKGZpdDEpDQpkYXRzIDwtIGFyYWI0X3JlZyAlPiUgDQogIHNlbGVjdChzeW1wLCBmZW1hbGUsIHdvcmssIGluY29tZSwgYWdlLCBlZHVjICwgcGVyc29uYWxwaWV0eSAsICBwYXRyaWFyY2hhbHZhbHVlcywgbGliZXJhbGlzbGFtLCBjbnRyeSwNCiAgICAgICAgIG5vZGVtb2MsIGdlbmRlcmFwYXJ0dW5pLCBjb3ZlcnVwLA0Kd29tYW53b3JrLCB3b21lbmxlYWRlciwgd29tZW5lZHVjLCBsaWJlcmFsaXNsYW0sIGlzbGFtaXNtKSAlPiUgDQogIHNhbXBsZV9mcmFjKDEpICU+JSANCiAgbmEub21pdCgpDQpkYXRzJG5ldyA8LSBsb2coKDEtcmFuZ2UwMShkYXRzJHBlcnNvbmFscGlldHkpKSsxKjgpDQpoaXN0KGRhdHMkbmV3KQ0KZml0MiA8LSBnbG1lcihzeW1wIH4gZmVtYWxlICsgd29yayArIGluY29tZSArIGFnZSArIGVkdWMgKyBuZXcgKyBub2RlbW9jKyBnZW5kZXJhcGFydHVuaSsgY292ZXJ1cCArIA0Kd29tYW53b3JrKyB3b21lbmxlYWRlcisgd29tZW5lZHVjICsgd29yayAqIGVkdWMrI1JlbGlnaW9zaXR5IGFuZCBNb2RlcmF0aW9uDQogICAgICAgICAgICAgICAgKDEgfGNudHJ5KSwgZGF0YSA9IGRhdHMsDQogICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKCJsb2dpdCIpKSMsIA0KICAgICAgICAgICMgICAgZ2xtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAxMDAwMDApKSkNCnN1bW1hcnkoZml0MikNCmljYyhmaXQyKQ0KDQp0ZXhyZWc6OnNjcmVlbnJlZyhmaXQyKQ0KDQpwbG90X21vZGVsKGZpdDIsIHRlcm1zID0gYygicGVyc29uYWxwaWV0eSIpLCB0eXBlID0gImVmZiIpDQpwbG90X21vZGVsKGZpdDIsIHRlcm1zID0gYygibm9kZW1vYyIpLCB0eXBlID0gImVmZiIpDQpwbG90X21vZGVsKGZpdDIsIHRlcm1zID0gYygid29tZW5lZHVjIiksIHR5cGUgPSAiZWZmIikNCnNzIDwtIHNqcC5nbG1lcihmaXQyLCB0eXBlID0gImZlLnN0ZCIsIHNvcnQuZXN0ID0gVCwgc2hvdy52YWx1ZXMgPSBULCBzaG93LnAgPSBULCB5Lm9mZnNldCA9IDAuNCwgcC5rciA9IEZBTFNFKQ0Kc2pwLmludChmaXQyKQ0KDQojc3MNCmxpYnJhcnkoTXVNSW4pDQpyLnNxdWFyZWRHTE1NKGZpdDIpDQoNCm9wdGlvbnMoc2NpcGVuID0gOTk5KQ0KcGFjbWFuOjpwX2xvYWQobG9naXN0ZiwgYnJtcywgZ2xtbVRNQiwgcnN0YW5hcm0pDQpscjIgPSBsb2dpc3RmKHN5bXAgfiBmZW1hbGUgKyB3b3JrICsgaW5jb21lICsgYWdlICsgZWR1YyArIHBlcnNvbmFscGlldHkgKyBub2RlbW9jKyBnZW5kZXJhcGFydHVuaSsgY292ZXJ1cCArIA0Kd29tYW53b3JrKyB3b21lbmxlYWRlcisgd29tZW5lZHVjLCBkYXRhID0gZGF0cykNCnN1bW1hcnkobHIyKQ0KDQoNCmJybShzeW1wIH4gMSsgI1JlbGlnaW9zaXR5IGFuZCBNb2RlcmF0aW9uDQogICAgICAgICAgICAgICAgKDEgfGNudHJ5KSwgZGF0YSA9IGRhdHMsDQogICAgICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKCJsb2dpdCIpKQ0KDQojbTEgPC0gYnJtKA0KIyAgc3ltcCB+IDErICNSZWxpZ2lvc2l0eSBhbmQgTW9kZXJhdGlvbg0KIyAgICAgICAgICAgICAgICAoMSB8Y250cnkpLCBkYXRhID0gZGF0cywNCiMgIGZhbWlseSA9IHplcm9faW5mbGF0ZWRfcG9pc3NvbihsaW5rID0gImxvZyIsIGxpbmtfemkgPSAibG9naXQiKQ0KIykNCg0KbTIgPC0gc3Rhbl9nbG1lci5uYigNCiAgc3ltcCB+IGZlbWFsZSArIHdvcmsgKyBpbmNvbWUgKyBhZ2UgKyBlZHVjICsgcGVyc29uYWxwaWV0eSArIG5vZGVtb2MrIGdlbmRlcmFwYXJ0dW5pKyBjb3ZlcnVwICsgDQp3b21hbndvcmsrIHdvbWVubGVhZGVyKyB3b21lbmVkdWMrICNSZWxpZ2lvc2l0eSBhbmQgTW9kZXJhdGlvbg0KICAgICAgICAgICAgICAgICgxIHxjbnRyeSksIGRhdGEgPSBkYXRzDQopDQoNCnN1bW1hcnkobTIpDQp0aGVtZV9zZXQodGhlbWVfc2pwbG90KCkpDQpwbG90X21vZGVsKG0yLCB0eXBlID0gInByZWQiLCB0ZXJtcyA9IGMoInBlcnNvbmFscGlldHkiLCAibm9kZW1vYyIpLCBjaS5sdmwgPSAuMDAxKQ0KDQpwbG90X21vZGVsKG0yLCBicGUgPSAibWVhbiIsIGJwZS5zdHlsZSA9ICJkb3QiKQ0KDQptMyA8LSBzdGFuX2dsbWVyKCBzeW1wIH4gZmVtYWxlICsgd29yayArIGluY29tZSArIGFnZSArIGVkdWMgKyBwZXJzb25hbHBpZXR5ICsgbm9kZW1vYysgZ2VuZGVyYXBhcnR1bmkrIGNvdmVydXAgKyANCndvbWFud29yaysgd29tZW5sZWFkZXIrIHdvbWVuZWR1YysgbGliZXJhbGlzbGFtICsgaXNsYW1pc20gKyNSZWxpZ2lvc2l0eSBhbmQgTW9kZXJhdGlvbg0KICAgICAgICAgICAgICAgICgxIHxjbnRyeSksIGRhdGEgPSBkYXRzDQopDQoNCnRpZHlfc3RhbihtMykNCg0KcGxvdF9tb2RlbChtMywgdHlwZSA9ICJwcmVkIiwgdGVybXMgPSBjKCJpc2xhbWlzbSIsICJub2RlbW9jIiksIGNpLmx2bCA9IC4wMDEpDQoNCnBsb3RfbW9kZWwobTMsIGJwZSA9ICJtZWFuIiwgYnBlLnN0eWxlID0gImRvdCIsIHNvcnQuZXN0ID0gVCwgc2hvdy52YWx1ZXMgPSBULCBzaG93LnAgPSBULCB2YWx1ZS5vZmZzZXQgPSAwLjUpDQoNCnBsb3QobTMsIHByb2IgPSAwLjUsIHBhcnMgPSAiYmV0YSIpDQoNCnBhcmFtcyA8LSAgYygiZmVtYWxlIiAsICJ3b3JrIiAsICJpbmNvbWUiICwgImFnZSIgLCAiZWR1YyIgLCAicGVyc29uYWxwaWV0eSIgLCAibm9kZW1vYyIsICJnZW5kZXJhcGFydHVuaSIsICJjb3ZlcnVwIiAsIA0KIndvbWFud29yayIsICJ3b21lbmxlYWRlciIsICJ3b21lbmVkdWMiKQ0KDQpwbG90KG0zLCBwbG90ZnVuID0gImFyZWFzIiwgcHJvYiA9IDAuOSwgIyA/YmF5ZXNwbG90OjptY21jX2FyZWFzDQogICAgIHBhcnMgPSBwYXJhbXMpDQoNCnBwX2NoZWNrKG0zLCBwbG90ZnVuID0gImVycm9yX2Jpbm5lZCIpICAjID9iYXllc3Bsb3Q6OnBwY19lcnJvcl9iaW5uZWQNCg0KDQoNCg0KcGxvb290cyA8LSBmdW5jdGlvbih2YXJpYWJsZXMpIHsNCiAgcGxvdChtMywgcGxvdGZ1biA9ICJjb21ibyIsIHJlZ2V4X3BhcnMgPSB2YXJpYWJsZXMpDQp9DQoNCnBhcmFtcyAlPiUgDQogIG1hcChwbG9vb3RzKQ0KDQoobG9vMSA8LSBsb28obTMpKQ0KDQojIFByZWRpY3RlZCBwcm9iYWJpbGl0eSBhcyBhIGZ1bmN0aW9uIG9mIHgNCnByX3N3aXRjaCA8LSBmdW5jdGlvbih4LCBlc3RzKSBwbG9naXMoZXN0c1sxXSArIGVzdHNbMl0gKiB4KQ0KIyBBIGZ1bmN0aW9uIHRvIHNsaWdodGx5IGppdHRlciB0aGUgYmluYXJ5IGRhdGENCmppdHQgPC0gZnVuY3Rpb24oLi4uKSB7DQogIGdlb21fcG9pbnQoYWVzX3N0cmluZyguLi4pLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcihoZWlnaHQgPSAwLjA1LCB3aWR0aCA9IDAuMSksIA0KICAgICAgICAgICAgIHNpemUgPSAyLCBzaGFwZSA9IDIxLCBzdHJva2UgPSAwLjIpDQp9DQpnZ3Bsb3QoYXJhYjRfcmVnLCBhZXMoeCA9IHBlcnNvbmFscGlldHksIHkgPSBzeW1wLCBjb2xvciA9IHN5bXApKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLCAwLjUsIDEpKSArDQogIGppdHQoeD0icGVyc29uYWxwaWV0eSIpICsgDQogIHN0YXRfZnVuY3Rpb24oZnVuID0gcHJfc3dpdGNoLCBhcmdzID0gbGlzdChlc3RzID0gY29lZihtMykpLCANCiAgICAgICAgICAgICAgICBzaXplID0gMiwgY29sb3IgPSAiZ3JheTM1IikgKyBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKQ0KDQoNCg0KYGBgDQoNCg==